/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ClienteGui.java
 *
 * Created on 09-jun-2012, 10:40:10
 */

package Gui;

import ServidorRMI.*;
import ClasesDominio.*;
import ClienteRMI.*;
import java.io.*;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 *
 * @author Kleyvert
 */
public class ClienteGui extends javax.swing.JFrame implements Serializable{

    // Se coloca un Atributo del tipo de la interface del RMI
    InterfaceRMI _ObjetoInterface;
    String nombrebla = "";
    int RetornoPuerto;
   
    // constructores
    public ClienteGui()  {
        initComponents();
        
    }
    
    public ClienteGui(InterfaceRMI _ObjetoInterface, String[] arreglo) throws RemoteException{
       initComponents();
       this._ObjetoInterface = _ObjetoInterface;
       this.RetornoPuerto = 0;
       this.Controles(false);
       this.jArchivo.setEnabled(false);
       if (arreglo.length != 0)
           this.nombrebla = arreglo[0].toString();
         
    }

    // Getter y setter
    public int getRetornoPuerto() {
        return RetornoPuerto;
    }
    public void setRetornoPuerto(int RetornoPuerto) {
        this.RetornoPuerto = RetornoPuerto;
    }
    public InterfaceRMI getObjetoInterface() {
        return _ObjetoInterface;
    }
    public void setObjetoInterface(InterfaceRMI _ObjetoInterface) {
        this._ObjetoInterface = _ObjetoInterface;
    }

    // controles
    public void Controles(boolean setear){
        // seteamos los controles
      
        this.jBuscar.setEnabled(setear);
        this.jCargar.setEnabled(setear);
    }
    // cargamos al cliente con sus datos
    public void CargarCliente() throws RemoteException{
        int valorID = 0;
       
        // recojemos lo ingresado por el usuario
        String nombre = this.jTextNombre.getText().toString();
       //Verificamos que el coordinador sea seleccionado la primera vez
         if (this.nombrebla.equals("Ejecutar")){
            valorID = 1;
        }
        else{ // si el clienteRMI es un cliente el cual no es coordinador se
             // busca el PuertoID de ultimo cliente en insertarse en el anillo
            valorID = this._ObjetoInterface.ConsultarUltimoIDPuerto()+1;
        }
           Cliente cliente = new Cliente(nombre,valorID);
            // pasamos al metodo remoto el objeto del tipo cliente
           this.RetornoPuerto = this._ObjetoInterface.InsertarCliente(cliente);
           // llamamos al servidor propio de cada cliente
           LevantarServidorPropioCliente(RetornoPuerto);
           System.out.println("Valor del nuevo puerto: " + RetornoPuerto);
           if (valorID != 1){
               // Hacemos la busqueda de los nodos vecinos
               BuscarVecinoAnillo(RetornoPuerto);
           }
           // seteamos los controles para cargar un archivo nuevo
           this.Controles(true);
           this.jnombreCoordinador.setText(this._ObjetoInterface.BuscarCoordinadorActual());
    }

    // invocamos al metodo para instanciar el servidor cliente
     public void LevantarServidorPropioCliente(int puerto){
         // instanciamos un objeto del tipo clienteServer
         ClienteServer servidorCliente = new ClienteServer();
         // invocamos al metodo para levantar el servidor de cada cliente
         servidorCliente.IniciarServidorCliente(puerto);
     }

     // Metodo para buscar el primer nodo adyacente del anillo
     public void BuscarVecinoAnillo(int idClienteActual) throws RemoteException{
        int puertoVecino = 0;
        // se busca el puerto del vecino en servidor central
        puertoVecino = this._ObjetoInterface.BuscarNodoVecino(idClienteActual);
        
        // Se levanta y se conecta el clienteRMI del cliente Actual
        // con su predecesor
        try {
            // instanciamos la interfaz del cliente(NODO) al cual el nodo actual se va a conectar
            InterfaceRMI h = (InterfaceRMI) Naming.lookup("rmi://localhost:"+puertoVecino+"/AnilloCliente"+puertoVecino);
            System.out.println("Conectado al nodo del cliente con el puerto: "+puertoVecino);
        } catch (NotBoundException ex) {
            Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

     // Metodo que retorna la lista
     public void BuscarVecinosAnillo(int idClienteActual) throws RemoteException{
         ArrayList<Cliente> ListaClienteAnillo = new ArrayList<Cliente>();
         ListaClienteAnillo = this._ObjetoInterface.BuscarListaNodosVecinos(idClienteActual);
     }
   
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTextNombre = new javax.swing.JTextField();
        jAceptar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jnombreCoordinador = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jArchivo = new javax.swing.JTextField();
        jCargar = new javax.swing.JButton();
        jMensajeConfirmacion = new javax.swing.JLabel();
        jBuscar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jAceptar.setText("Aceptar");
        jAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jAceptarActionPerformed(evt);
            }
        });

        jLabel1.setText("Nombre:");

        jLabel2.setText("Coordinador:");

        jnombreCoordinador.setText("....................");

        jLabel4.setText("Impresoras UCAB");

        jLabel5.setText("Cargar Archivo:");

        jCargar.setText("Cargar");
        jCargar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCargarActionPerformed(evt);
            }
        });

        jBuscar.setText("Buscar");
        jBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBuscarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(285, Short.MAX_VALUE)
                .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(269, 269, 269))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(51, 51, 51)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE))
                        .addGap(18, 18, 18))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(27, 27, 27)))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jnombreCoordinador, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addComponent(jCargar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jMensajeConfirmacion, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE))
                            .addComponent(jArchivo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 352, Short.MAX_VALUE)
                            .addComponent(jTextNombre, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 352, Short.MAX_VALUE))
                        .addGap(29, 29, 29)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jBuscar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jAceptar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addGap(58, 58, 58))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(39, 39, 39)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 41, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jnombreCoordinador))
                .addGap(39, 39, 39)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jAceptar))
                .addGap(38, 38, 38)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(jArchivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jBuscar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jCargar)
                    .addComponent(jMensajeConfirmacion, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(71, 71, 71))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jAceptarActionPerformed
        try {
            
            CargarCliente();
            
        } catch (RemoteException ex) {
            Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jAceptarActionPerformed

    private void jCargarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCargarActionPerformed
         
        
        try {
            String mensajeDevolucion = "";
            // agarramos el nombre del archivo del textbox
            String nombreArchivo = this.jArchivo.getText().toString();
            // instanciamos un objeto del tipo archivo y le pasamos por parametro
            // el nombre del archivo cargado
            Archivo archivo = new Archivo(nombreArchivo);
            // hacemos la invocacion del objeto remoto para pasar el objeto
            // del tipo archivo y el PuertoID de cliente
            mensajeDevolucion = this._ObjetoInterface.EnviarArchivoServidor(archivo, RetornoPuerto);
            // seteamos el label con el mensaje retornado del servidor
            this.jMensajeConfirmacion.setText(mensajeDevolucion);

        } catch (RemoteException ex) {
            Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }//GEN-LAST:event_jCargarActionPerformed

    // Metodo para Buscar el archivo a imprimir
    private void jBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBuscarActionPerformed
        boolean verificarArchivo = false;
        // Codigo para cargar un archivo
        JFileChooser archivos= new JFileChooser();
        archivos.showOpenDialog(archivos);
        // guardamos el path del archivo
        String path ="";
               path= archivos.getSelectedFile().getName();
        // verificamos que el archivo escojito es de tipo "txt"
        for ( int cuenta = path.length() - 1; cuenta >= 0; cuenta-- ){
            if ( (path.charAt(cuenta)== 't') && (path.charAt(cuenta-1)== 'x') &&
                 (path.charAt(cuenta-2)== 't') ){
                  verificarArchivo = true;
            }
        }
        if (verificarArchivo){
        // seteamos el textLabel con el nombre del archivo seleccionado
                jArchivo.setText(path);
                this.jCargar.setEnabled(verificarArchivo);
        }else{
             // mostramos un mensaje de error
             JOptionPane.showMessageDialog( null,path,
             "Debe seleccionar un archivo del tipo TXT",
             JOptionPane.ERROR_MESSAGE );
        }

    }//GEN-LAST:event_jBuscarActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ClienteGui().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jAceptar;
    private javax.swing.JTextField jArchivo;
    private javax.swing.JButton jBuscar;
    private javax.swing.JButton jCargar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jMensajeConfirmacion;
    private javax.swing.JTextField jTextNombre;
    private javax.swing.JLabel jnombreCoordinador;
    // End of variables declaration//GEN-END:variables

}
